package xyz.liuz.edb;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

public class MyServer {
    public static void main(String[] args) {

        try {
            EventLoopGroup bossGroup = new NioEventLoopGroup(1);
            EventLoopGroup workerGroup = new NioEventLoopGroup(5);

            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childOption(ChannelOption.SO_KEEPALIVE,true)
                    .option(ChannelOption.SO_BACKLOG,500)
//                    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 30)
                    .childOption(ChannelOption.TCP_NODELAY,true)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ServiceServerChannelInitializer());
            ChannelFuture f = b.bind(8899).sync();
            System.out.println("服务启动成功");
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {

        }

    }
/**
 * ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数，
 * 函数listen(int socketfd,int backlog)用来初始化服务端可连接队列，
 * 服务端处理客户端连接请求是顺序处理的，所以同一时间只能处理一个客户端连接，
 * 多个客户端来的时候，服务端将不能处理的客户端连接请求放在队列中等待处理，backlog参数指定了队列的大小
 * */
/**
 * ChannelOption.TCP_NODELAY参数对应于套接字选项中的TCP_NODELAY,该参数的使用与Nagle算法有关。
 * Nagle算法是将小的数据包组装为更大的帧然后进行发送，而不是输入一次发送一次,因此在数据包不足的时候会等待其他数据的到了，
 * 组装成大的数据包进行发送，虽然该方式有效提高网络的有效负载，但是却造成了延时，
 * 而该参数的作用就是禁止使用Nagle算法，使用于小数据即时传输，
 * 于TCP_NODELAY相对应的是TCP_CORK，该选项是需要等到发送的数据量最大的时候，一次性发送数据，适用于文件传输。
 * */
}
